home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1999 July: Mac OS SDK / Dev.CD Jul 99 SDK1.toast / Development Kits / Mac OS / Interfaces&Libraries / Universal / Interfaces / AIncludes / OCE.a < prev    next >
Encoding:
Text File  |  1998-08-17  |  60.5 KB  |  1,948 lines  |  [TEXT/MPS ]

  1. ;
  2. ;    File:        OCE.a
  3. ;
  4. ;    Contains:    Apple Open Collaboration Environment (AOCE) Interfaces.
  5. ;
  6. ;    Version:    Technology:    AOCE Toolbox 1.02
  7. ;                Release:    Universal Interfaces 3.2
  8. ;
  9. ;    Copyright:    © 1994-1998 by Apple Computer, Inc., all rights reserved.
  10. ;
  11. ;    Bugs?:        For bug reports, consult the following page on
  12. ;                the World Wide Web:
  13. ;
  14. ;                    http://developer.apple.com/bugreporter/
  15. ;
  16. ;
  17.     IF &TYPE('__OCE__') = 'UNDEFINED' THEN
  18. __OCE__ SET 1
  19.  
  20.     IF &TYPE('__MACTYPES__') = 'UNDEFINED' THEN
  21.     include 'MacTypes.a'
  22.     ENDIF
  23.     IF &TYPE('__ALIASES__') = 'UNDEFINED' THEN
  24.     include 'Aliases.a'
  25.     ENDIF
  26.     IF &TYPE('__APPLEEVENTS__') = 'UNDEFINED' THEN
  27.     include 'AppleEvents.a'
  28.     ENDIF
  29.  
  30. ;  All utility routines defined here are callable at interrupt level. 
  31. ; typedef unsigned short                 OCERecordTypeIndex
  32.  
  33. ; typedef unsigned short                 OCEAttributeTypeIndex
  34.  
  35. ;  For anyone who absolutely needs a define of the body of the standard record or
  36. ;attribute type, use these below.  CAUTION!  All the types below are assumed to be
  37. ;in character set 'smRoman'.  If you try to compare these to some RString or
  38. ;AttributeType variable, you must take the character set code into account.  Future
  39. ;standard types may be defined using character sets other than 'smRoman'. 
  40.  
  41.  
  42. ;  All these standard definitions begin with the Apple symbol (not shown here).
  43. ;
  44. ;NOTE:  To access these, you must call OCEGetIndRecordType or OCEGetIndAttributeType
  45. ;with the proper index.  These routines return pointers to the standard type.
  46. ;This was done so that code fragments (INITs, CDEVs, CSAMs, etc). which cannot
  47. ;use global data can also use these. 
  48.  
  49. ;  Indices for the standard definitions for certain record types (OCERecordTypeIndex): 
  50.  
  51. kUserRecTypeNum                    EQU        1                    ; "User" 
  52. kGroupRecTypeNum                EQU        2                    ; "Group" 
  53. kMnMRecTypeNum                    EQU        3                    ; "AppleMail™ M&M" 
  54. kMnMForwarderRecTypeNum            EQU        4                    ; "AppleMail™ Fwdr" 
  55. kNetworkSpecRecTypeNum            EQU        5                    ; "NetworkSpec" 
  56. kADAPServerRecTypeNum            EQU        6                    ; "ADAP Server" 
  57. kADAPDNodeRecTypeNum            EQU        7                    ; "ADAP DNode" 
  58. kADAPDNodeRepRecTypeNum            EQU        8                    ; "ADAP DNode Rep" 
  59. kServerSetupRecTypeNum            EQU        9                    ; "Server Setup" 
  60. kDirectoryRecTypeNum            EQU        10                    ; "Directory" 
  61. kDNodeRecTypeNum                EQU        11                    ; "DNode" 
  62. kSetupRecTypeNum                EQU        12                    ; "Setup" 
  63. kMSAMRecTypeNum                    EQU        13                    ; "MSAM" 
  64. kDSAMRecTypeNum                    EQU        14                    ; "DSAM" 
  65. kAttributeValueRecTypeNum        EQU        15                    ; "Attribute Value" 
  66. kBusinessCardRecTypeNum            EQU        16                    ; "Business Card" 
  67. kMailServiceRecTypeNum            EQU        17                    ; "Mail Service" 
  68. kCombinedRecTypeNum                EQU        18                    ; "Combined" 
  69. kOtherServiceRecTypeNum            EQU        19                    ; "Other Service" 
  70. kAFPServiceRecTypeNum            EQU        20                    ; "Other Service afps" 
  71. kFirstOCERecTypeNum                EQU        1                    ; first standard OCE record type 
  72. kLastOCERecTypeNum                EQU        20                    ; last standard OCE record type 
  73. kNumOCERecTypes                    EQU        20
  74. ;  Indices for the standard definitions for certain attribute types (OCEAttributeTypeIndex): 
  75.  
  76. kMemberAttrTypeNum                EQU        1001                ; "Member" 
  77. kAdminsAttrTypeNum                EQU        1002                ; "Administrators" 
  78. kMailSlotsAttrTypeNum            EQU        1003                ; "mailslots" 
  79. kPrefMailAttrTypeNum            EQU        1004                ; "pref mailslot" 
  80. kAddressAttrTypeNum                EQU        1005                ; "Address" 
  81. kPictureAttrTypeNum                EQU        1006                ; "Picture" 
  82. kAuthKeyAttrTypeNum                EQU        1007                ; "auth key" 
  83. kTelephoneAttrTypeNum            EQU        1008                ; "Telephone" 
  84. kNBPNameAttrTypeNum                EQU        1009                ; "NBP Name" 
  85. kQMappingAttrTypeNum            EQU        1010                ; "ForwarderQMap" 
  86. kDialupSlotAttrTypeNum            EQU        1011                ; "DialupSlotInfo" 
  87. kHomeNetAttrTypeNum                EQU        1012                ; "Home Internet" 
  88. kCoResAttrTypeNum                EQU        1013                ; "Co-resident M&M" 
  89. kFwdrLocalAttrTypeNum            EQU        1014                ; "FwdrLocalRecord" 
  90. kConnectAttrTypeNum                EQU        1015                ; "Connected To" 
  91. kForeignAttrTypeNum                EQU        1016                ; "Foreign RLIs" 
  92. kOwnersAttrTypeNum                EQU        1017                ; "Owners" 
  93. kReadListAttrTypeNum            EQU        1018                ; "ReadList" 
  94. kWriteListAttrTypeNum            EQU        1019                ; "WriteList" 
  95. kDescriptorAttrTypeNum            EQU        1020                ; "Descriptor" 
  96. kCertificateAttrTypeNum            EQU        1021                ; "Certificate" 
  97. kMsgQsAttrTypeNum                EQU        1022                ; "MessageQs" 
  98. kPrefMsgQAttrTypeNum            EQU        1023                ; "PrefMessageQ" 
  99. kMasterPFAttrTypeNum            EQU        1024                ; "MasterPF" 
  100. kMasterNetSpecAttrTypeNum        EQU        1025                ; "MasterNetSpec" 
  101. kServersOfAttrTypeNum            EQU        1026                ; "Servers Of" 
  102. kParentCIDAttrTypeNum            EQU        1027                ; "Parent CID" 
  103. kNetworkSpecAttrTypeNum            EQU        1028                ; "NetworkSpec" 
  104. kLocationAttrTypeNum            EQU        1029                ; "Location" 
  105. kTimeSvrTypeAttrTypeNum            EQU        1030                ; "TimeServer Type" 
  106. kUpdateTimerAttrTypeNum            EQU        1031                ; "Update Timer" 
  107. kShadowsOfAttrTypeNum            EQU        1032                ; "Shadows Of" 
  108. kShadowServerAttrTypeNum        EQU        1033                ; "Shadow Server" 
  109. kTBSetupAttrTypeNum                EQU        1034                ; "TB Setup" 
  110. kMailSetupAttrTypeNum            EQU        1035                ; "Mail Setup" 
  111. kSlotIDAttrTypeNum                EQU        1036                ; "SlotID" 
  112. kGatewayFileIDAttrTypeNum        EQU        1037                ; "Gateway FileID" 
  113. kMailServiceAttrTypeNum            EQU        1038                ; "Mail Service" 
  114. kStdSlotInfoAttrTypeNum            EQU        1039                ; "Std Slot Info" 
  115. kAssoDirectoryAttrTypeNum        EQU        1040                ; "Asso. Directory" 
  116. kDirectoryAttrTypeNum            EQU        1041                ; "Directory" 
  117. kDirectoriesAttrTypeNum            EQU        1042                ; "Directories" 
  118. kSFlagsAttrTypeNum                EQU        1043                ; "SFlags" 
  119. kLocalNameAttrTypeNum            EQU        1044                ; "Local Name" 
  120. kLocalKeyAttrTypeNum            EQU        1045                ; "Local Key" 
  121. kDirUserRIDAttrTypeNum            EQU        1046                ; "Dir User RID" 
  122. kDirUserKeyAttrTypeNum            EQU        1047                ; "Dir User Key" 
  123. kDirNativeNameAttrTypeNum        EQU        1048                ; "Dir Native Name" 
  124. kCommentAttrTypeNum                EQU        1049                ; "Comment" 
  125. kRealNameAttrTypeNum            EQU        1050                ; "Real Name" 
  126. kPrivateDataAttrTypeNum            EQU        1051                ; "Private Data" 
  127. kDirTypeAttrTypeNum                EQU        1052                ; "Directory Type" 
  128. kDSAMFileAliasAttrTypeNum        EQU        1053                ; "DSAM File Alias" 
  129. kCanAddressToAttrTypeNum        EQU        1054                ; "Can Address To" 
  130. kDiscriminatorAttrTypeNum        EQU        1055                ; "Discriminator" 
  131. kAliasAttrTypeNum                EQU        1056                ; "Alias" 
  132. kParentMSAMAttrTypeNum            EQU        1057                ; "Parent MSAM" 
  133. kParentDSAMAttrTypeNum            EQU        1058                ; "Parent DSAM" 
  134. kSlotAttrTypeNum                EQU        1059                ; "Slot" 
  135. kAssoMailServiceAttrTypeNum        EQU        1060                ; "Asso. Mail Service" 
  136. kFakeAttrTypeNum                EQU        1061                ; "Fake" 
  137. kInheritSysAdminAttrTypeNum        EQU        1062                ; "Inherit SysAdministrators" 
  138. kPreferredPDAttrTypeNum            EQU        1063                ; "Preferred PD" 
  139. kLastLoginAttrTypeNum            EQU        1064                ; "Last Login" 
  140. kMailerAOMStateAttrTypeNum        EQU        1065                ; "Mailer AOM State" 
  141. kMailerSendOptionsAttrTypeNum    EQU        1066                ; "Mailer Send Options" 
  142. kJoinedAttrTypeNum                EQU        1067                ; "Joined" 
  143. kUnconfiguredAttrTypeNum        EQU        1068                ; "Unconfigured" 
  144. kVersionAttrTypeNum                EQU        1069                ; "Version" 
  145. kLocationNamesAttrTypeNum        EQU        1070                ; "Location Names" 
  146. kActiveAttrTypeNum                EQU        1071                ; "Active" 
  147. kDeleteRequestedAttrTypeNum        EQU        1072                ; "Delete Requested" 
  148. kGatewayTypeAttrTypeNum            EQU        1073                ; "Gateway Type" 
  149. kFirstOCEAttrTypeNum            EQU        1001                ; first standard OCE attr type 
  150. kLastOCEAttrTypeNum                EQU        1073                ; last standard OCE attr type 
  151. kNumOCEAttrTypes                EQU        73
  152.  
  153. ;  Miscellaneous enums: 
  154.  
  155. kRString32Size                    EQU        32                    ; max size of the body field in RString32 
  156. kRString64Size                    EQU        64                    ; max size of the body field in RString64 
  157. kNetworkSpecMaxBytes            EQU        32                    ; max size of the body field in NetworkSpec 
  158. kPathNameMaxBytes                EQU        1024                ; max size of the data field in PackedPathName 
  159. kDirectoryNameMaxBytes            EQU        32                    ; max size of the body field in DirectoryName 
  160. kAttributeTypeMaxBytes            EQU        32                    ; max size of the body field in AttributeType 
  161. kAttrValueMaxBytes                EQU        65536                ; max size of any attribute value 
  162. kRStringMaxBytes                EQU        256                    ; max size (in bytes) of the body field of a recordName or recordType 
  163. kRStringMaxChars                EQU        128                    ; max size (in chars) of the body field of a recordName or recordType 
  164.  
  165. kNULLDNodeNumber                EQU        0                    ; Special value meaning none specified 
  166. kRootDNodeNumber                EQU        2                    ; DNodeNum corresponding to the root of the tree 
  167.  
  168. ;  This enum is used to select the kind of RString in calls such as OCERelRString,
  169. ;OCEEqualRString, and OCEValidRString.
  170. ;
  171. ;eGenericSensitive and eGenericInsensitive are enumerators that can be used if you
  172. ;use RStrings for things other than what you see in this file.  If you want them to
  173. ;be compared in a case- and diacritical-sensitive manner (c ≠ C ≠ ç), use
  174. ;eGenericSensitive.  If you want them to be compared in a case- and diacritical-
  175. ;insensitive manner (c = C = ç), use eGenericInensitive.
  176. ;WARNING:  do not use eGenericSensitive and eGenericInsensitive with catalog
  177. ;names, entity names, pathname parts, entity types, network specs, or attribute
  178. ;types!  Don't assume that you know how they should be compared!!! 
  179.  
  180.  
  181. kOCEDirName                        EQU        0
  182. kOCERecordOrDNodeName            EQU        1
  183. kOCERecordType                    EQU        2
  184. kOCENetworkSpec                    EQU        3
  185. kOCEAttrType                    EQU        4
  186. kOCEGenericSensitive            EQU        5
  187. kOCEGenericInsensitive            EQU        6
  188. ; typedef unsigned short                 RStringKind
  189.  
  190. ;  Values for the signature field in Discriminator 
  191.  
  192. kDirAllKinds                    EQU        0
  193. kDirADAPKind                    EQU        'adap'
  194. kDirPersonalDirectoryKind        EQU        'pdir'
  195. kDirDSAMKind                    EQU        'dsam'
  196.  
  197. ; typedef unsigned long                 OCEDirectoryKind
  198.  
  199. ;  Values returned by GetDSSpecInfo() 
  200.  
  201. kOCEInvalidDSSpec                EQU        $3F3F3F3F            ; '????' could not be determined 
  202. kOCEDirsRootDSSpec                EQU        'root'                ; root of all catalogs ("Catalogs" icon) 
  203. kOCEDirectoryDSSpec                EQU        'dire'                ; catalog 
  204. kOCEDNodeDSSpec                    EQU        'dnod'                ; d-node 
  205. kOCERecordDSSpec                EQU        'reco'                ; record 
  206. kOCEentnDSSpec                    EQU        'entn'                ; extensionType is 'entn' 
  207. kOCENOTentnDSSpec                EQU        'not '                ; extensionType is not 'entn' 
  208.  
  209. ;  Values for AttributeTag 
  210.  
  211. typeRString                        EQU        'rstr'
  212. typePackedDSSpec                EQU        'dspc'
  213. typeBinary                        EQU        'bnry'
  214.  
  215. ;  Bit flag corresponding to the canContainRecords bit.  Use it like this:
  216. ;    if (foo & kCanContainRecords)
  217. ;        then this dNode can contain records!
  218. ;kForeignNode is used to indicate nodes in the name hierarchy that correspond to
  219. ;foreign catalogs (meaning ADAP sees no clusters or DNodes beneath it, but
  220. ;mail routers might be able to route to clusters beneath it. 
  221.  
  222.  
  223. kCanContainRecordsBit            EQU        0
  224. kForeignNodeBit                    EQU        1
  225. ;  DirNodeKind 
  226.  
  227. kCanContainRecords                EQU        $00000001
  228. kForeignNode                    EQU        $00000002
  229. ; typedef unsigned long                 DirNodeKind
  230.  
  231.  
  232.  
  233. ; *** Toolbox Control ***
  234. ;  We will have a version number and attributes for toolboxes off the aa5e trap
  235. ;and the S&F server trap.
  236. ;
  237. ;This includes the OCE toolbox and S&F Server.  [Note: the S&F server will
  238. ;change to ONLY service ServerGateway calls —it will then be necessary to run
  239. ;it co–resident with an OCE toolbox].
  240. ;
  241. ;The high order word will represent the S&F Server version number.  The low
  242. ;order word will represent the OCE toolbox version number.  These will be zero
  243. ;until the component is up and running.  It is not possible to know these
  244. ;a–priori. Note: there will not be a seperate version numbers for each component
  245. ;in the OCE toolbox or S&F server.
  246. ;
  247. ;The above is consistent with the standard System 7.0 usage of Gestalt.
  248. ;
  249. ;The oce tb attribute gestaltOCETBPresent implies the existence of OCE on a
  250. ;machine.
  251. ;
  252. ;The OCE TB attribute gestaltOCETBAvailable implies the availablity of OCE calls.
  253. ;
  254. ;The attribute gestaltOCESFServerAvailable implies the availablity of OCE calls
  255. ;available through the S&F server. This are essentially the server gateway calls.
  256. ;
  257. ;Any (future) remaining OCE attributes may not be established correctly until
  258. ;the attribute gestaltOCETBAvailable is set.
  259. ;
  260. ;
  261.  
  262.  
  263. ;     Constants used for Transitions. 
  264.  
  265. ATTransIPMStart                    EQU        'ipms'
  266. ATTransIPMShutdown                EQU        'ipmd'
  267. ATTransDirStart                    EQU        'dirs'
  268. ATTransDirShutdown                EQU        'dird'
  269. ATTransAuthStart                EQU        'auts'
  270. ATTransAuthShutdown                EQU        'autd'
  271. ATTransSFStart                    EQU        's&fs'
  272. ATTransSFShutdown                EQU        's&fd'
  273.  
  274.  
  275. ;  Some definitions for time-related parameters: 
  276. ;  Interpreted as UTC seconds since 1/1/1904 
  277. ; typedef unsigned long                 UTCTime
  278.  
  279. ;  seconds EAST of Greenwich 
  280. ; typedef long                             UTCOffset
  281.  
  282. ;  This is the same as the ScriptManager script. 
  283. ; typedef short                         CharacterSet
  284.  
  285. ; *** RString ***
  286.  
  287. ;  struct RString is a maximum-sized structure.  Allocate one of these and it will
  288. ;hold any valid RString. 
  289. RString                    RECORD 0
  290. charSet                     ds.w    1                ; offset: $0 (0)
  291. dataLength                 ds.w    1                ; offset: $2 (2)
  292. body                     ds.b    256                ; offset: $4 (4)        ;  place for characters 
  293. sizeof                     EQU *                    ; size:   $104 (260)
  294.                         ENDR
  295. ;  struct ProtoRString is a minimum-sized structure.  Use this for a variable-length RString. 
  296. ProtoRString            RECORD 0
  297. charSet                     ds.w    1                ; offset: $0 (0)
  298. dataLength                 ds.w    1                ; offset: $2 (2)
  299. sizeof                     EQU *                    ; size:   $4 (4)
  300.                         ENDR
  301. ; typedef struct RString *                RStringPtr
  302.  
  303. ; typedef RStringPtr *                    RStringHandle
  304.  
  305. ; typedef struct ProtoRString *            ProtoRStringPtr
  306.  
  307. RString64                RECORD 0
  308. charSet                     ds.w    1                ; offset: $0 (0)
  309. dataLength                 ds.w    1                ; offset: $2 (2)
  310. body                     ds.b    64                ; offset: $4 (4)
  311. sizeof                     EQU *                    ; size:   $44 (68)
  312.                         ENDR
  313. RString32                RECORD 0
  314. charSet                     ds.w    1                ; offset: $0 (0)
  315. dataLength                 ds.w    1                ; offset: $2 (2)
  316. body                     ds.b    32                ; offset: $4 (4)
  317. sizeof                     EQU *                    ; size:   $24 (36)
  318.                         ENDR
  319. ;  Standard definitions for the entity type field and attribute type
  320. ;have been moved to the end of the file. 
  321.  
  322. ;  Copies str1 to str2.  str2Length is the size of str2, excluding header.
  323. ;A memFull error will be returned if that is not as large as str1->dataLength. 
  324. ;
  325. ; pascal OSErr OCECopyRString(const RString *str1, RString *str2, unsigned short str2Length)
  326. ;
  327.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  328.         Macro
  329.         _OCECopyRString
  330.             move.w              #$0308,D0
  331.             dc.w                $AA5C
  332.         EndM
  333.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  334.         IMPORT_CFM_FUNCTION OCECopyRString
  335.     ENDIF
  336.  
  337.  
  338. ;     Make an RString from a C string.  If the c string is bigger than rStrLength,
  339. ;only rStrLength bytes will be copied. (rStrLength does not include the header size) 
  340. ;
  341. ; pascal void OCECToRString(const char *cStr, CharacterSet charSet, RString *rStr, unsigned short rStrLength)
  342. ;
  343.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  344.         Macro
  345.         _OCECToRString
  346.             move.w              #$0339,D0
  347.             dc.w                $AA5C
  348.         EndM
  349.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  350.         IMPORT_CFM_FUNCTION OCECToRString
  351.     ENDIF
  352.  
  353.  
  354. ;     Make an RString from a Pascal string.  If the Pascal string is bigger than rStrLength,
  355. ;only rStrLength bytes will be copied. (rStrLength does not include the header size) 
  356. ;
  357. ; pascal void OCEPToRString(ConstStr255Param pStr, CharacterSet charSet, RString *rStr, unsigned short rStrLength)
  358. ;
  359.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  360.         Macro
  361.         _OCEPToRString
  362.             move.w              #$033A,D0
  363.             dc.w                $AA5C
  364.         EndM
  365.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  366.         IMPORT_CFM_FUNCTION OCEPToRString
  367.     ENDIF
  368.  
  369.  
  370. ;     Make a Pascal string from an RString.  It's up to you to check the char set of
  371. ;the RString, or if the length of the RString is greater than 255 (the Pascal string's
  372. ;length will simply be the lower byte of the RString's length).  The StringPtr that is
  373. ;returned will point directly into the RString (no memory will be allocated). 
  374.  
  375. ;
  376. ; pascal StringPtr OCERToPString(const RString *rStr)
  377. ;
  378.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  379.         Macro
  380.         _OCERToPString
  381.             move.w              #$033B,D0
  382.             dc.w                $AA5C
  383.         EndM
  384.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  385.         IMPORT_CFM_FUNCTION OCERToPString
  386.     ENDIF
  387.  
  388. ;     Check the relative equality of two RStrings.  Determines if str1 is greater than,
  389. ;equal to, or less than str2.  Result types for OCERelRString are defined in <OSUtils.h>
  390. ;(same as for RelString). 
  391.  
  392. ;
  393. ; pascal short OCERelRString(const void *str1, const void *str2, RStringKind kind)
  394. ;
  395.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  396.         Macro
  397.         _OCERelRString
  398.             move.w              #$032D,D0
  399.             dc.w                $AA5C
  400.         EndM
  401.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  402.         IMPORT_CFM_FUNCTION OCERelRString
  403.     ENDIF
  404.  
  405.  
  406. ;     Check for equality of two RStrings. Returns true if equal. 
  407. ;
  408. ; pascal Boolean OCEEqualRString(const void *str1, const void *str2, RStringKind kind)
  409. ;
  410.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  411.         Macro
  412.         _OCEEqualRString
  413.             move.w              #$0316,D0
  414.             dc.w                $AA5C
  415.         EndM
  416.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  417.         IMPORT_CFM_FUNCTION OCEEqualRString
  418.     ENDIF
  419.  
  420.  
  421. ;     Check the validity of an RString.  Returns true if the RString is valid 
  422. ;
  423. ; pascal Boolean OCEValidRString(const void *str, RStringKind kind)
  424. ;
  425.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  426.         Macro
  427.         _OCEValidRString
  428.             move.w              #$0338,D0
  429.             dc.w                $AA5C
  430.         EndM
  431.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  432.         IMPORT_CFM_FUNCTION OCEValidRString
  433.     ENDIF
  434.  
  435.  
  436. ; *** CreationID ***
  437. CreationID                RECORD 0
  438. source                     ds.l    1                ; offset: $0 (0)        ;  Fields definitions and usage are not defined 
  439. seq                         ds.l    1                ; offset: $4 (4)
  440. sizeof                     EQU *                    ; size:   $8 (8)
  441.                         ENDR
  442. AttributeCreationID        RECORD 0
  443. f                         ds        CreationID
  444. sizeof                     EQU *                    ; size:   $8 (8)
  445.                         ENDR
  446.  
  447.  
  448. ; typedef struct CreationID *            CreationIDPtr
  449.  
  450.  
  451. ;  Returns a pointer to a null CreationID . 
  452. ;
  453. ; pascal const CreationID *OCENullCID(void )
  454. ;
  455.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  456.         Macro
  457.         _OCENullCID
  458.             move.w              #$0344,D0
  459.             dc.w                $AA5C
  460.         EndM
  461.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  462.         IMPORT_CFM_FUNCTION OCENullCID
  463.     ENDIF
  464.  
  465.  
  466. ;  Returns a pointer to a special CreationID used within the PathFinder. 
  467. ;
  468. ; pascal const CreationID *OCEPathFinderCID(void )
  469. ;
  470.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  471.         Macro
  472.         _OCEPathFinderCID
  473.             move.w              #$033C,D0
  474.             dc.w                $AA5C
  475.         EndM
  476.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  477.         IMPORT_CFM_FUNCTION OCEPathFinderCID
  478.     ENDIF
  479.  
  480.  
  481. ;  Sets the CreationID to a null value. 
  482. ;
  483. ; pascal void OCESetCreationIDtoNull(CreationID *cid)
  484. ;
  485.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  486.         Macro
  487.         _OCESetCreationIDtoNull
  488.             move.w              #$032E,D0
  489.             dc.w                $AA5C
  490.         EndM
  491.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  492.         IMPORT_CFM_FUNCTION OCESetCreationIDtoNull
  493.     ENDIF
  494.  
  495.  
  496. ;  Copies the value of cid1 to cid2. 
  497. ;
  498. ; pascal void OCECopyCreationID(const CreationID *cid1, CreationID *cid2)
  499. ;
  500.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  501.         Macro
  502.         _OCECopyCreationID
  503.             move.w              #$0300,D0
  504.             dc.w                $AA5C
  505.         EndM
  506.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  507.         IMPORT_CFM_FUNCTION OCECopyCreationID
  508.     ENDIF
  509.  
  510.  
  511. ;  Check the equality of two CreationIDs. 
  512. ;
  513. ; pascal Boolean OCEEqualCreationID(const CreationID *cid1, const CreationID *cid2)
  514. ;
  515.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  516.         Macro
  517.         _OCEEqualCreationID
  518.             move.w              #$030C,D0
  519.             dc.w                $AA5C
  520.         EndM
  521.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  522.         IMPORT_CFM_FUNCTION OCEEqualCreationID
  523.     ENDIF
  524.  
  525.  
  526. ; *** NetworkSpec ***
  527. ;  For the record, a NetworkSpec is an RString with a smaller maximum size.
  528. ;I don't just typedef it to an RString, because I want the definition of the NetworkSpec
  529. ;struct to contain the max length.  But it should be possible to typecast any
  530. ;NetworkSpec to an RString and use all the RString utilities on it. 
  531.  
  532. NetworkSpec                RECORD 0
  533. charSet                     ds.w    1                ; offset: $0 (0)
  534. dataLength                 ds.w    1                ; offset: $2 (2)
  535. body                     ds.b    32                ; offset: $4 (4)        ;  always fixed at the max size 
  536. sizeof                     EQU *                    ; size:   $24 (36)
  537.                         ENDR
  538. ; typedef struct NetworkSpec *            NetworkSpecPtr
  539.  
  540.  
  541. ; *** PackedPathName ***
  542. ;  struct PackedPathName is a maximum-sized structure.  Allocate one of
  543. ;these and it will hold any valid packed pathname. 
  544. PackedPathName            RECORD 0
  545. dataLength                 ds.w    1                ; offset: $0 (0)        ;  dataLength excludes the space for the dataLength field 
  546. data                     ds.b    1022            ; offset: $2 (2)
  547. sizeof                     EQU *                    ; size:   $400 (1024)
  548.                         ENDR
  549. ;  struct ProtoPackedPathName is a minimum-sized structure.  Use this
  550. ;for a variable-length packed PathName. 
  551. ProtoPackedPathName        RECORD 0
  552. dataLength                 ds.w    1                ; offset: $0 (0)        ;  dataLength excludes the space for the dataLength field 
  553. ;  Followed by data 
  554. sizeof                     EQU *                    ; size:   $2 (2)
  555.                         ENDR
  556. ; typedef struct PackedPathName *        PackedPathNamePtr
  557.  
  558. ; typedef struct ProtoPackedPathName *    ProtoPackedPathNamePtr
  559.  
  560. ;Copy the contents of path1 to path2.  path2Length is the size of path2, and must
  561. ;be large enough to hold a copy of path1.  A memFull error will be returned if that
  562. ;is not the case.
  563. ;
  564.  
  565. ;
  566. ; pascal OSErr OCECopyPackedPathName(const PackedPathName *path1, PackedPathName *path2, unsigned short path2Length)
  567. ;
  568.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  569.         Macro
  570.         _OCECopyPackedPathName
  571.             move.w              #$0304,D0
  572.             dc.w                $AA5C
  573.         EndM
  574.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  575.         IMPORT_CFM_FUNCTION OCECopyPackedPathName
  576.     ENDIF
  577.  
  578.  
  579. ;Returns true if packed path pointer is nil, or is of zero length, or is of
  580. ;length 2 and nParts of zero.
  581. ;
  582.  
  583. ;
  584. ; pascal Boolean OCEIsNullPackedPathName(const PackedPathName *path)
  585. ;
  586.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  587.         Macro
  588.         _OCEIsNullPackedPathName
  589.             move.w              #$031D,D0
  590.             dc.w                $AA5C
  591.         EndM
  592.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  593.         IMPORT_CFM_FUNCTION OCEIsNullPackedPathName
  594.     ENDIF
  595.  
  596.  
  597. ;OCEUnpackPathName breaks apart the path into its component RStrings, writing string
  598. ;pointers into the array 'parts', which the client asserts can hold as many as
  599. ;'nParts' elements. The number of parts actually found is returned.  Strings are
  600. ;placed in the array in order from lowest to highest.  The first pathName element
  601. ;beneath the root appears last.  NOTE THAT THE UNPACKED STRUCT CONTAINS POINTERS INTO
  602. ;THE PACKED STRUCT - DON'T DELETE OR REUSE THE PACKED STRUCT UNTIL YOU ARE FINISHED
  603. ;WITH THE UNPACKED STRUCT AS WELL
  604. ;
  605.  
  606. ;
  607. ; pascal unsigned short OCEUnpackPathName(const PackedPathName *path, RStringPtr *parts, unsigned short nParts)
  608. ;
  609.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  610.         Macro
  611.         _OCEUnpackPathName
  612.             move.w              #$0330,D0
  613.             dc.w                $AA5C
  614.         EndM
  615.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  616.         IMPORT_CFM_FUNCTION OCEUnpackPathName
  617.     ENDIF
  618.  
  619. ;OCEPackedPathNameSize computes the number of bytes of memory needed to hold a
  620. ;PackedPathName manufactured from the array of parts.  This length
  621. ;includes the length of the length field of PackedPathName, so it
  622. ;is safe to do a NewPtr (OCEPackedPathNameSize(...)).
  623. ;
  624.  
  625. ;
  626. ; pascal unsigned short OCEPackedPathNameSize(const RStringPtr *parts, unsigned short nParts)
  627. ;
  628.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  629.         Macro
  630.         _OCEPackedPathNameSize
  631.             move.w              #$0328,D0
  632.             dc.w                $AA5C
  633.         EndM
  634.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  635.         IMPORT_CFM_FUNCTION OCEPackedPathNameSize
  636.     ENDIF
  637.  
  638. ;  OCEDNodeNameCount returns the number of RStrings contained within the path. 
  639. ;
  640. ; pascal unsigned short OCEDNodeNameCount(const PackedPathName *path)
  641. ;
  642.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  643.         Macro
  644.         _OCEDNodeNameCount
  645.             move.w              #$032C,D0
  646.             dc.w                $AA5C
  647.         EndM
  648.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  649.         IMPORT_CFM_FUNCTION OCEDNodeNameCount
  650.     ENDIF
  651.  
  652.  
  653. ;OCEPackPathName packs the parts into the storage provided as 'path'.  path must be
  654. ;large enough to hold the packed pathname.  A memFull error will be returned if
  655. ;pathLength is too small.  parts[0] should contain the deepest pathName element,
  656. ;and parts[nParts - 1] should contain the name of the first pathName element beneath
  657. ;the root. 
  658. ;
  659.  
  660. ;
  661. ; pascal OSErr OCEPackPathName(RStringPtr *parts, unsigned short nParts, PackedPathName *path, unsigned short pathLength)
  662. ;
  663.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  664.         Macro
  665.         _OCEPackPathName
  666.             move.w              #$0323,D0
  667.             dc.w                $AA5C
  668.         EndM
  669.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  670.         IMPORT_CFM_FUNCTION OCEPackPathName
  671.     ENDIF
  672.  
  673. ;Check the equality of two packed paths.
  674. ;
  675.  
  676. ;
  677. ; pascal Boolean OCEEqualPackedPathName(const PackedPathName *path1, const PackedPathName *path2)
  678. ;
  679.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  680.         Macro
  681.         _OCEEqualPackedPathName
  682.             move.w              #$0311,D0
  683.             dc.w                $AA5C
  684.         EndM
  685.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  686.         IMPORT_CFM_FUNCTION OCEEqualPackedPathName
  687.     ENDIF
  688.  
  689.  
  690. ;OCEValidPackedPathName checks that the packed PathName is internally consistent.
  691. ;Returns true if it's ok.
  692. ;
  693.  
  694. ;
  695. ; pascal Boolean OCEValidPackedPathName(const PackedPathName *path)
  696. ;
  697.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  698.         Macro
  699.         _OCEValidPackedPathName
  700.             move.w              #$0334,D0
  701.             dc.w                $AA5C
  702.         EndM
  703.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  704.         IMPORT_CFM_FUNCTION OCEValidPackedPathName
  705.     ENDIF
  706.  
  707.  
  708. ; *** DirDiscriminator ***
  709. DirDiscriminator        RECORD 0
  710. signature                 ds.l    1                ; offset: $0 (0)
  711. misc                     ds.l    1                ; offset: $4 (4)
  712. sizeof                     EQU *                    ; size:   $8 (8)
  713.                         ENDR
  714. ;  Copies the value of disc1 to disc2. 
  715. ;
  716. ; pascal void OCECopyDirDiscriminator(const DirDiscriminator *disc1, DirDiscriminator *disc2)
  717. ;
  718.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  719.         Macro
  720.         _OCECopyDirDiscriminator
  721.             move.w              #$0301,D0
  722.             dc.w                $AA5C
  723.         EndM
  724.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  725.         IMPORT_CFM_FUNCTION OCECopyDirDiscriminator
  726.     ENDIF
  727.  
  728.  
  729. ;  Check the equality of two DirDiscriminators. 
  730. ;
  731. ; pascal Boolean OCEEqualDirDiscriminator(const DirDiscriminator *disc1, const DirDiscriminator *disc2)
  732. ;
  733.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  734.         Macro
  735.         _OCEEqualDirDiscriminator
  736.             move.w              #$030D,D0
  737.             dc.w                $AA5C
  738.         EndM
  739.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  740.         IMPORT_CFM_FUNCTION OCEEqualDirDiscriminator
  741.     ENDIF
  742.  
  743. ;This structure is called RLI because it really contains all the info you
  744. ;need to locate a record within the entire name space.  It contains four fields.
  745. ;The first two are the name of the catalog and a catalog discriminator.  These
  746. ;two fields are used to indicate to which catalog a given record belongs.  The
  747. ;discriminator is used to distinguish between two different catalogs that have
  748. ;the same name.
  749. ;
  750. ;The other two fields in the RLI structure are used to indicate a particular
  751. ;catalog node within the catalog specified by the directoryName and
  752. ;discriminator fields.  These fields are exactly analagous to the dirID and
  753. ;pathname used in HFS.  It is possible to specify a dNode just by dNodeNumber
  754. ;(pathname is nil), or just by pathname (dNodeNumber is set to kNULLDNodeNumber),
  755. ;or by a combination of the two.  The latter is called a 'partial pathname', and
  756. ;while it is valid in the Catalog Manager API, it is not supported by ADAP
  757. ;catalogs in Release 1.
  758. ;
  759. ;Note that the path parameter does not include the catalog name, but holds
  760. ;the names of all the nodes on the path to the desired catalog node, starting
  761. ;with the catalog node and working its way up the tree.
  762. ;
  763.  
  764.  
  765. ; *** RLI ***
  766.  
  767. DirectoryName            RECORD 0
  768. charSet                     ds.w    1                ; offset: $0 (0)
  769. dataLength                 ds.w    1                ; offset: $2 (2)
  770. body                     ds.b    32                ; offset: $4 (4)        ;  space for catalog name 
  771. sizeof                     EQU *                    ; size:   $24 (36)
  772.                         ENDR
  773. ; typedef struct DirectoryName *        DirectoryNamePtr
  774.  
  775. ;  Catalog node number 
  776. ; typedef unsigned long                 DNodeNum
  777.  
  778. RLI                        RECORD 0
  779. directoryName             ds.l    1                ; offset: $0 (0)        ;  pointer to the name of the catalog root 
  780. discriminator             ds        DirDiscriminator ; offset: $4 (4)        ;  used to discriminate between dup catalog names 
  781. dNodeNumber                 ds.l    1                ; offset: $C (12)        ;  number of the node 
  782. path                     ds.l    1                ; offset: $10 (16)        ;  old-style RLI 
  783. sizeof                     EQU *                    ; size:   $14 (20)
  784.                         ENDR
  785. ; typedef struct RLI *                    RLIPtr
  786.  
  787. ;Create a new RLI from the catalog name, discriminator, DNode number, and
  788. ;PackedPathName.  You must allocate the storage for the RLI and pass in a pointer
  789. ;to it.
  790. ;
  791.  
  792. ;
  793. ; pascal void OCENewRLI(RLI *newRLI, const DirectoryName *dirName, DirDiscriminator *discriminator, DNodeNum dNodeNumber, const PackedPathName *path)
  794. ;
  795.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  796.         Macro
  797.         _OCENewRLI
  798.             move.w              #$031F,D0
  799.             dc.w                $AA5C
  800.         EndM
  801.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  802.         IMPORT_CFM_FUNCTION OCENewRLI
  803.     ENDIF
  804.  
  805.  
  806. ;Duplicate the contents of rli1 to rli2.  No errors are returned. This
  807. ;simply copies the pointers to the catalog name and path, wiping out any pointer
  808. ;that you might have had in there.
  809. ;
  810.  
  811. ;
  812. ; pascal void OCEDuplicateRLI(const RLI *rli1, RLI *rli2)
  813. ;
  814.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  815.         Macro
  816.         _OCEDuplicateRLI
  817.             move.w              #$030B,D0
  818.             dc.w                $AA5C
  819.         EndM
  820.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  821.         IMPORT_CFM_FUNCTION OCEDuplicateRLI
  822.     ENDIF
  823.  
  824.  
  825. ;Copy the contents of rli1 to rli2.  rli2 must already contain
  826. ;pointers to structures large enough to hold copies of the corresponding
  827. ;fields from rli1.  A memFull error will be returned if that is not the case.
  828. ;So if you allocate a brand new empty destination, you must at least set up
  829. ;its length fields.
  830. ;
  831.  
  832. ;
  833. ; pascal OSErr OCECopyRLI(const RLI *rli1, RLI *rli2)
  834. ;
  835.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  836.         Macro
  837.         _OCECopyRLI
  838.             move.w              #$0307,D0
  839.             dc.w                $AA5C
  840.         EndM
  841.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  842.         IMPORT_CFM_FUNCTION OCECopyRLI
  843.     ENDIF
  844.  
  845.  
  846. ;Check the equality of two RLIs.  This will take into account differences
  847. ;in the case and diacriticals of the directoryName and the PathName.
  848. ;NOTE THAT THIS WILL FAIL IF rli1 CONTAINS A DNODENUMBER AND A NIL PATHNAME,
  849. ;AND rli2 CONTAINS kNULLDNodeNumber AND A NON-NIL PATHNAME.  IN OTHER WORDS,
  850. ;THE TWO rlis MUST BE OF THE SAME FORM TO CHECK FOR EQUALITY.
  851. ;The one exception is that if the pathname is nil, a dNodeNumber of zero and
  852. ;kRootDNodeNumber will be treated as equal.
  853. ;
  854.  
  855. ;
  856. ; pascal Boolean OCEEqualRLI(const RLI *rli1, const RLI *rli2)
  857. ;
  858.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  859.         Macro
  860.         _OCEEqualRLI
  861.             move.w              #$0315,D0
  862.             dc.w                $AA5C
  863.         EndM
  864.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  865.         IMPORT_CFM_FUNCTION OCEEqualRLI
  866.     ENDIF
  867.  
  868.  
  869. ;Check the validity of an RLI.  This checks that the catalog name length
  870. ;is within bounds, and the packed pathname (if specified) is valid.
  871. ;
  872.  
  873. ;
  874. ; pascal Boolean OCEValidRLI(const RLI *theRLI)
  875. ;
  876.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  877.         Macro
  878.         _OCEValidRLI
  879.             move.w              #$0337,D0
  880.             dc.w                $AA5C
  881.         EndM
  882.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  883.         IMPORT_CFM_FUNCTION OCEValidRLI
  884.     ENDIF
  885.  
  886. ; *** PackedRLI ***
  887. ;struct PackedRLI is a maximum-sized structure.  Allocate one of
  888. ;these and it will hold any valid packed pathname.
  889. ;
  890.  
  891.  
  892. kRLIMaxBytes                    EQU        1296
  893. PackedRLI                RECORD 0
  894. dataLength                 ds.w    1                ; offset: $0 (0)        ;  dataLength excludes the space for the dataLength field 
  895. data                     ds.b    1296            ; offset: $2 (2)
  896. sizeof                     EQU *                    ; size:   $512 (1298)
  897.                         ENDR
  898. ;struct ProtoPackedRLI is a minimum-sized structure.  Use this
  899. ;for a variable-length packed RLI.
  900. ;
  901.  
  902. ProtoPackedRLI            RECORD 0
  903. dataLength                 ds.w    1                ; offset: $0 (0)        ;  dataLength excludes the space for the dataLength field 
  904. ;  Followed by data 
  905. sizeof                     EQU *                    ; size:   $2 (2)
  906.                         ENDR
  907. ; typedef struct PackedRLI *            PackedRLIPtr
  908.  
  909. ; typedef struct ProtoPackedRLI *        ProtoPackedRLIPtr
  910.  
  911. ;Copy the contents of prli1 to prli2.  prli2Length is the size of prli2, and must
  912. ;be large enough to hold a copy of prli1.  A memFull error will be returned if that
  913. ;is not the case.
  914. ;
  915.  
  916. ;
  917. ; pascal OSErr OCECopyPackedRLI(const PackedRLI *prli1, PackedRLI *prli2, unsigned short prli2Length)
  918. ;
  919.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  920.         Macro
  921.         _OCECopyPackedRLI
  922.             move.w              #$0305,D0
  923.             dc.w                $AA5C
  924.         EndM
  925.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  926.         IMPORT_CFM_FUNCTION OCECopyPackedRLI
  927.     ENDIF
  928.  
  929.  
  930. ;OCEUnpackRLI breaks apart the prli into its components, writing pointers into
  931. ;the rli structure.  NOTE THAT THE UNPACKED STRUCT CONTAINS POINTERS INTO THE
  932. ;PACKED STRUCT - DON'T DELETE OR REUSE THE PACKED STRUCT UNTIL YOU ARE FINISHED
  933. ;WITH THE UNPACKED STRUCT AS WELL
  934. ;
  935.  
  936. ;
  937. ; pascal void OCEUnpackRLI(const PackedRLI *prli, RLI *theRLI)
  938. ;
  939.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  940.         Macro
  941.         _OCEUnpackRLI
  942.             move.w              #$0331,D0
  943.             dc.w                $AA5C
  944.         EndM
  945.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  946.         IMPORT_CFM_FUNCTION OCEUnpackRLI
  947.     ENDIF
  948.  
  949.  
  950. ;OCEPackedRLISize computes the number of bytes of memory needed to hold a
  951. ;PackedRLI manufactured from an RLI.  This length
  952. ;includes the length of the length field of PackedRLI, so it
  953. ;is safe to do a NewPtr (OCEPackedRLISize(...)).
  954. ;
  955.  
  956. ;
  957. ; pascal unsigned short OCEPackedRLISize(const RLI *theRLI)
  958. ;
  959.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  960.         Macro
  961.         _OCEPackedRLISize
  962.             move.w              #$032A,D0
  963.             dc.w                $AA5C
  964.         EndM
  965.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  966.         IMPORT_CFM_FUNCTION OCEPackedRLISize
  967.     ENDIF
  968.  
  969.  
  970. ;OCEPackRLI packs the RLI into the storage provided as 'prli'.  prli must be
  971. ;large enough to hold the packed RLI.  A memFull error will be returned if
  972. ;prliLength is too small.
  973. ;
  974.  
  975. ;
  976. ; pascal OSErr OCEPackRLI(const RLI *theRLI, PackedRLI *prli, unsigned short prliLength)
  977. ;
  978.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  979.         Macro
  980.         _OCEPackRLI
  981.             move.w              #$0324,D0
  982.             dc.w                $AA5C
  983.         EndM
  984.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  985.         IMPORT_CFM_FUNCTION OCEPackRLI
  986.     ENDIF
  987.  
  988.  
  989. ;OCEPackedRLIPartsSize computes the number of bytes of memory needed to hold a
  990. ;PackedRLI manufactured from the parts of an RLI.  This length
  991. ;includes the length of the length field of PackedRLI, so it
  992. ;is safe to do a NewPtr (OCEPackedRLIPartsSize(...)).
  993. ;
  994.  
  995. ;
  996. ; pascal unsigned short OCEPackedRLIPartsSize(const DirectoryName *dirName, RStringPtr *parts, unsigned short nParts)
  997. ;
  998.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  999.         Macro
  1000.         _OCEPackedRLIPartsSize
  1001.             move.w              #$0329,D0
  1002.             dc.w                $AA5C
  1003.         EndM
  1004.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  1005.         IMPORT_CFM_FUNCTION OCEPackedRLIPartsSize
  1006.     ENDIF
  1007.  
  1008. ;OCEPackRLIParts packs the parts of an RLI into the storage provided as 'prli'.
  1009. ;prli must be large enough to hold the packed RLI.  A memFull error will be returned
  1010. ;if prliLength is too small.
  1011. ;
  1012.  
  1013. ;
  1014. ; pascal OSErr OCEPackRLIParts(const DirectoryName *dirName, const DirDiscriminator *discriminator, DNodeNum dNodeNumber, RStringPtr *parts, unsigned short nParts, PackedRLI *prli, unsigned short prliLength)
  1015. ;
  1016.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  1017.         Macro
  1018.         _OCEPackRLIParts
  1019.             move.w              #$0325,D0
  1020.             dc.w                $AA5C
  1021.         EndM
  1022.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  1023.         IMPORT_CFM_FUNCTION OCEPackRLIParts
  1024.     ENDIF
  1025.  
  1026. ;Check the equality of two packed prlis.
  1027. ;
  1028.  
  1029. ;
  1030. ; pascal Boolean OCEEqualPackedRLI(const PackedRLI *prli1, const PackedRLI *prli2)
  1031. ;
  1032.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  1033.         Macro
  1034.         _OCEEqualPackedRLI
  1035.             move.w              #$0313,D0
  1036.             dc.w                $AA5C
  1037.         EndM
  1038.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  1039.         IMPORT_CFM_FUNCTION OCEEqualPackedRLI
  1040.     ENDIF
  1041.  
  1042.  
  1043. ;Check the validity of a packed RLI.  This checks that the catalog name length
  1044. ;is within bounds, and the packed pathname (if specified) is valid.
  1045. ;
  1046.  
  1047. ;
  1048. ; pascal Boolean OCEValidPackedRLI(const PackedRLI *prli)
  1049. ;
  1050.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  1051.         Macro
  1052.         _OCEValidPackedRLI
  1053.             move.w              #$0336,D0
  1054.             dc.w                $AA5C
  1055.         EndM
  1056.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  1057.         IMPORT_CFM_FUNCTION OCEValidPackedRLI
  1058.     ENDIF
  1059.  
  1060. ;If this packed RLI describes a Personal Catalog, this call will return a pointer
  1061. ;to an alias record that can be used to find the actual file.  Otherwise, it returns nil.
  1062. ;
  1063.  
  1064. ;
  1065. ; pascal AliasPtr OCEExtractAlias(const PackedRLI *prli)
  1066. ;
  1067.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  1068.         Macro
  1069.         _OCEExtractAlias
  1070.             move.w              #$0318,D0
  1071.             dc.w                $AA5C
  1072.         EndM
  1073.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  1074.         IMPORT_CFM_FUNCTION OCEExtractAlias
  1075.     ENDIF
  1076.  
  1077. ;This call returns a pointer to a packed RLI that represents the "Catalogs" icon, or
  1078. ;the root of all catalogs.  It is used in the CollabPack.
  1079. ;
  1080.  
  1081. ;
  1082. ; pascal const PackedRLI *OCEGetDirectoryRootPackedRLI(void )
  1083. ;
  1084.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  1085.         Macro
  1086.         _OCEGetDirectoryRootPackedRLI
  1087.             move.w              #$0346,D0
  1088.             dc.w                $AA5C
  1089.         EndM
  1090.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  1091.         IMPORT_CFM_FUNCTION OCEGetDirectoryRootPackedRLI
  1092.     ENDIF
  1093.  
  1094. ; *** LocalRecordID ***
  1095. LocalRecordID            RECORD 0
  1096. cid                         ds        CreationID        ; offset: $0 (0)
  1097. recordName                 ds.l    1                ; offset: $8 (8)
  1098. recordType                 ds.l    1                ; offset: $C (12)
  1099. sizeof                     EQU *                    ; size:   $10 (16)
  1100.                         ENDR
  1101. ; typedef struct LocalRecordID *        LocalRecordIDPtr
  1102.  
  1103. ;  Create a LocalRecordID from a name, type, and CreationID 
  1104. ;
  1105. ; pascal void OCENewLocalRecordID(const RString *recordName, const RString *recordType, const CreationID *cid, LocalRecordID *lRID)
  1106. ;
  1107.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  1108.         Macro
  1109.         _OCENewLocalRecordID
  1110.             move.w              #$031E,D0
  1111.             dc.w                $AA5C
  1112.         EndM
  1113.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  1114.         IMPORT_CFM_FUNCTION OCENewLocalRecordID
  1115.     ENDIF
  1116.  
  1117. ;Copy LocalRecordID lRID1 to LocalRecordID lRID2.  lRID2 must already contain
  1118. ;pointers to RString structures large enough to hold copies of the corresponding
  1119. ;fields from lRID1.  A memFull error will be returned if that is not the case.
  1120. ;So if you allocate a brand new empty destination, you must at least set up
  1121. ;its length field.
  1122. ;
  1123.  
  1124. ;
  1125. ; pascal OSErr OCECopyLocalRecordID(const LocalRecordID *lRID1, LocalRecordID *lRID2)
  1126. ;
  1127.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  1128.         Macro
  1129.         _OCECopyLocalRecordID
  1130.             move.w              #$0302,D0
  1131.             dc.w                $AA5C
  1132.         EndM
  1133.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  1134.         IMPORT_CFM_FUNCTION OCECopyLocalRecordID
  1135.     ENDIF
  1136.  
  1137.  
  1138. ;Check the equality of two local RIDs.
  1139. ;
  1140.  
  1141. ;
  1142. ; pascal Boolean OCEEqualLocalRecordID(const LocalRecordID *lRID1, const LocalRecordID *lRID2)
  1143. ;
  1144.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  1145.         Macro
  1146.         _OCEEqualLocalRecordID
  1147.             move.w              #$030F,D0
  1148.             dc.w                $AA5C
  1149.         EndM
  1150.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  1151.         IMPORT_CFM_FUNCTION OCEEqualLocalRecordID
  1152.     ENDIF
  1153.  
  1154. ; *** ShortRecordID ***
  1155. ShortRecordID            RECORD 0
  1156. rli                         ds.l    1                ; offset: $0 (0)
  1157. cid                         ds        CreationID        ; offset: $4 (4)
  1158. sizeof                     EQU *                    ; size:   $C (12)
  1159.                         ENDR
  1160. ; typedef struct ShortRecordID *        ShortRecordIDPtr
  1161.  
  1162. ;  Create a ShortRecordID from an RLI struct and a CreationID 
  1163. ;
  1164. ; pascal void OCENewShortRecordID(const PackedRLI *theRLI, const CreationID *cid, ShortRecordIDPtr sRID)
  1165. ;
  1166.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  1167.         Macro
  1168.         _OCENewShortRecordID
  1169.             move.w              #$0321,D0
  1170.             dc.w                $AA5C
  1171.         EndM
  1172.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  1173.         IMPORT_CFM_FUNCTION OCENewShortRecordID
  1174.     ENDIF
  1175.  
  1176.  
  1177. ;Copy ShortRecordID sRID1 to ShortRecordID sRID2.  sRID2 must already contain
  1178. ;pointers to structures large enough to hold copies of the corresponding
  1179. ;fields from sRID1.  A memFull error will be returned if that is not the case.
  1180. ;So if you allocate a brand new empty destination, you must at least set up
  1181. ;its length fields.
  1182. ;
  1183.  
  1184. ;
  1185. ; pascal OSErr OCECopyShortRecordID(const ShortRecordID *sRID1, ShortRecordID *sRID2)
  1186. ;
  1187.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  1188.         Macro
  1189.         _OCECopyShortRecordID
  1190.             move.w              #$030A,D0
  1191.             dc.w                $AA5C
  1192.         EndM
  1193.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  1194.         IMPORT_CFM_FUNCTION OCECopyShortRecordID
  1195.     ENDIF
  1196.  
  1197.  
  1198. ;Check the equality of two short RIDs.
  1199. ;
  1200.  
  1201. ;
  1202. ; pascal Boolean OCEEqualShortRecordID(const ShortRecordID *sRID1, const ShortRecordID *sRID2)
  1203. ;
  1204.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  1205.         Macro
  1206.         _OCEEqualShortRecordID
  1207.             move.w              #$0317,D0
  1208.             dc.w                $AA5C
  1209.         EndM
  1210.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  1211.         IMPORT_CFM_FUNCTION OCEEqualShortRecordID
  1212.     ENDIF
  1213.  
  1214. ; *** RecordID ***
  1215. RecordID                RECORD 0
  1216. rli                         ds.l    1                ; offset: $0 (0)        ;  pointer to a packed rli structure 
  1217. local                     ds        LocalRecordID    ; offset: $4 (4)
  1218. sizeof                     EQU *                    ; size:   $14 (20)
  1219.                         ENDR
  1220. ; typedef struct RecordID *                RecordIDPtr
  1221.  
  1222. ;     Create a RecordID from a packed RLI struct and a LocalRecordID.
  1223. ;This doesn't allocate any new space; the RecordID points to the same
  1224. ;packed RLI struct and the same name and type RStrings. 
  1225.  
  1226. ;
  1227. ; pascal void OCENewRecordID(const PackedRLI *theRLI, const LocalRecordID *lRID, RecordID *rid)
  1228. ;
  1229.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  1230.         Macro
  1231.         _OCENewRecordID
  1232.             move.w              #$0320,D0
  1233.             dc.w                $AA5C
  1234.         EndM
  1235.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  1236.         IMPORT_CFM_FUNCTION OCENewRecordID
  1237.     ENDIF
  1238.  
  1239.  
  1240. ;Copy RecordID RID1 to RecordID RID2.  RID2 must already contain
  1241. ;pointers to structures large enough to hold copies of the corresponding
  1242. ;fields from lRID1.  A memFull error will be returned if that is not the case.
  1243. ;So if you allocate a brand new empty destination, you must at least set up
  1244. ;its length fields.
  1245. ;
  1246.  
  1247. ;
  1248. ; pascal OSErr OCECopyRecordID(const RecordID *rid1, const RecordID *rid2)
  1249. ;
  1250.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  1251.         Macro
  1252.         _OCECopyRecordID
  1253.             move.w              #$0309,D0
  1254.             dc.w                $AA5C
  1255.         EndM
  1256.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  1257.         IMPORT_CFM_FUNCTION OCECopyRecordID
  1258.     ENDIF
  1259.  
  1260.  
  1261. ;     Check the equality of two RIDs. 
  1262. ;
  1263. ; pascal Boolean OCEEqualRecordID(const RecordID *rid1, const RecordID *rid2)
  1264. ;
  1265.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  1266.         Macro
  1267.         _OCEEqualRecordID
  1268.             move.w              #$0314,D0
  1269.             dc.w                $AA5C
  1270.         EndM
  1271.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  1272.         IMPORT_CFM_FUNCTION OCEEqualRecordID
  1273.     ENDIF
  1274.  
  1275.  
  1276. ; *** PackedRecordID ***
  1277. ;struct PackedRecordID is a maximum-sized structure.  Allocate one of
  1278. ;these and it will hold any valid packed RecordID.
  1279. ;
  1280.  
  1281.  
  1282. kPackedRecordIDMaxBytes            EQU        1824
  1283. PackedRecordID            RECORD 0
  1284. dataLength                 ds.w    1                ; offset: $0 (0)        ;  dataLength excludes the space for the dataLength field 
  1285. data                     ds.b    1824            ; offset: $2 (2)
  1286. sizeof                     EQU *                    ; size:   $722 (1826)
  1287.                         ENDR
  1288. ;struct ProtoPackedRecordID is a minimum-sized structure.  Use this
  1289. ;for a variable-length packed RecordID.
  1290. ;
  1291.  
  1292. ProtoPackedRecordID        RECORD 0
  1293. dataLength                 ds.w    1                ; offset: $0 (0)        ;  dataLength excludes the space for the dataLength field 
  1294. ;  Followed by data 
  1295. sizeof                     EQU *                    ; size:   $2 (2)
  1296.                         ENDR
  1297. ; typedef struct PackedRecordID *        PackedRecordIDPtr
  1298.  
  1299. ; typedef struct ProtoPackedRecordID *    ProtoPackedRecordIDPtr
  1300.  
  1301. ;Copy PackedRecordID pRID1 to PackedRecordID pRID2.  pRID2 must already contain
  1302. ;pointers to structures large enough to hold copies of the corresponding
  1303. ;fields from pRID1.  A memFull error will be returned if that is not the case.
  1304. ;pRID2Length is the number of bytes that can be put into pRID2, not counting the
  1305. ;packed RecordID header.
  1306. ;
  1307.  
  1308. ;
  1309. ; pascal OSErr OCECopyPackedRecordID(const PackedRecordID *pRID1, const PackedRecordID *pRID2, unsigned short pRID2Length)
  1310. ;
  1311.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  1312.         Macro
  1313.         _OCECopyPackedRecordID
  1314.             move.w              #$0306,D0
  1315.             dc.w                $AA5C
  1316.         EndM
  1317.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  1318.         IMPORT_CFM_FUNCTION OCECopyPackedRecordID
  1319.     ENDIF
  1320.  
  1321.  
  1322. ;Create a RecordID from a PackedRecordID.
  1323. ;NOTE THAT THE UNPACKED STRUCT CONTAINS POINTERS INTO THE PACKED STRUCT - DON'T DELETE
  1324. ;OR REUSE THE PACKED STRUCT UNTIL YOU ARE FINISHED WITH THE UNPACKED STRUCT AS WELL
  1325. ;
  1326.  
  1327. ;
  1328. ; pascal void OCEUnpackRecordID(const PackedRecordID *pRID, RecordID *rid)
  1329. ;
  1330.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  1331.         Macro
  1332.         _OCEUnpackRecordID
  1333.             move.w              #$0332,D0
  1334.             dc.w                $AA5C
  1335.         EndM
  1336.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  1337.         IMPORT_CFM_FUNCTION OCEUnpackRecordID
  1338.     ENDIF
  1339.  
  1340.  
  1341. ;Create a PackedRecordID from a RecordID.  pRID must be large enough to contain
  1342. ;the packed RecordID.  A memFull error will be returned if that is not the case.
  1343. ;packedRecordIDLength is the number of bytes that can be put into pRID, not
  1344. ;counting the header.
  1345. ;
  1346.  
  1347. ;
  1348. ; pascal OSErr OCEPackRecordID(const RecordID *rid, PackedRecordID *pRID, unsigned short packedRecordIDLength)
  1349. ;
  1350.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  1351.         Macro
  1352.         _OCEPackRecordID
  1353.             move.w              #$0326,D0
  1354.             dc.w                $AA5C
  1355.         EndM
  1356.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  1357.         IMPORT_CFM_FUNCTION OCEPackRecordID
  1358.     ENDIF
  1359.  
  1360.  
  1361. ;Compute the number of bytes of memory needed to hold a RecordID when packed. This
  1362. ;length includes the length of the length field of PackedRecordID, so it
  1363. ;is safe to do a NewPtr (OCEPackedRecordIDSize(...)).
  1364. ;
  1365.  
  1366. ;
  1367. ; pascal unsigned short OCEPackedRecordIDSize(const RecordID *rid)
  1368. ;
  1369.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  1370.         Macro
  1371.         _OCEPackedRecordIDSize
  1372.             move.w              #$032B,D0
  1373.             dc.w                $AA5C
  1374.         EndM
  1375.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  1376.         IMPORT_CFM_FUNCTION OCEPackedRecordIDSize
  1377.     ENDIF
  1378.  
  1379.  
  1380. ;Check the equality of two packed RIDs.
  1381. ;
  1382.  
  1383. ;
  1384. ; pascal Boolean OCEEqualPackedRecordID(const PackedRecordID *pRID1, const PackedRecordID *pRID2)
  1385. ;
  1386.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  1387.         Macro
  1388.         _OCEEqualPackedRecordID
  1389.             move.w              #$0312,D0
  1390.             dc.w                $AA5C
  1391.         EndM
  1392.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  1393.         IMPORT_CFM_FUNCTION OCEEqualPackedRecordID
  1394.     ENDIF
  1395.  
  1396.  
  1397. ;  OCEValidPackedRecordID checks the validity of a packed record ID. 
  1398. ;
  1399. ; pascal Boolean OCEValidPackedRecordID(const PackedRecordID *pRID)
  1400. ;
  1401.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  1402.         Macro
  1403.         _OCEValidPackedRecordID
  1404.             move.w              #$0335,D0
  1405.             dc.w                $AA5C
  1406.         EndM
  1407.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  1408.         IMPORT_CFM_FUNCTION OCEValidPackedRecordID
  1409.     ENDIF
  1410.  
  1411.  
  1412. ; *** DSSpec ***
  1413. DSSpec                    RECORD 0
  1414. entitySpecifier             ds.l    1                ; offset: $0 (0)
  1415. extensionType             ds.l    1                ; offset: $4 (4)
  1416. extensionSize             ds.w    1                ; offset: $8 (8)
  1417. extensionValue             ds.l    1                ; offset: $A (10)
  1418. sizeof                     EQU *                    ; size:   $E (14)
  1419.                         ENDR
  1420. ; typedef struct DSSpec *                DSSpecPtr
  1421.  
  1422. ;struct PackedDSSpec is NOT a maximum-sized structure.  Allocate one of
  1423. ;these and it will hold any valid packed RecordID, but not necessarily any additional
  1424. ;data.
  1425. ;
  1426.  
  1427.  
  1428.  
  1429. kPackedDSSpecMaxBytes            EQU        1832
  1430. PackedDSSpec            RECORD 0
  1431. dataLength                 ds.w    1                ; offset: $0 (0)        ;  dataLength excludes the space for the dataLength field 
  1432. data                     ds.b    1832            ; offset: $2 (2)
  1433. sizeof                     EQU *                    ; size:   $72A (1834)
  1434.                         ENDR
  1435. ; typedef struct PackedDSSpec *            PackedDSSpecPtr
  1436.  
  1437. ; typedef PackedDSSpecPtr *                PackedDSSpecHandle
  1438.  
  1439. ;struct ProtoPackedDSSpec is a minimum-sized structure.  Use this
  1440. ;for a variable-length packed DSSpec.
  1441. ;
  1442.  
  1443. ProtoPackedDSSpec        RECORD 0
  1444. dataLength                 ds.w    1                ; offset: $0 (0)        ;  dataLength excludes the space for the dataLength field 
  1445. ;  Followed by data 
  1446. sizeof                     EQU *                    ; size:   $2 (2)
  1447.                         ENDR
  1448. ; typedef struct ProtoPackedDSSpec *    ProtoPackedDSSpecPtr
  1449.  
  1450. ;Copy PackedDSSpec pdss1 to PackedDSSpec pdss2.  pdss2 must already contain
  1451. ;pointers to structures large enough to hold copies of the corresponding
  1452. ;fields from pdss1.  A memFull error will be returned if that is not the case.
  1453. ;pdss2Length is the number of bytes that can be put into pdss2, not counting the
  1454. ;packed DSSpec header.
  1455. ;
  1456.  
  1457. ;
  1458. ; pascal OSErr OCECopyPackedDSSpec(const PackedDSSpec *pdss1, const PackedDSSpec *pdss2, unsigned short pdss2Length)
  1459. ;
  1460.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  1461.         Macro
  1462.         _OCECopyPackedDSSpec
  1463.             move.w              #$0303,D0
  1464.             dc.w                $AA5C
  1465.         EndM
  1466.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  1467.         IMPORT_CFM_FUNCTION OCECopyPackedDSSpec
  1468.     ENDIF
  1469.  
  1470.  
  1471. ;Create a DSSpec from a PackedDSSpec.
  1472. ;NOTE THAT THE UNPACKED STRUCT CONTAINS POINTERS INTO THE PACKED STRUCT - DON'T DELETE
  1473. ;OR REUSE THE PACKED STRUCT UNTIL YOU ARE FINISHED WITH THE UNPACKED STRUCT AS WELL.
  1474. ;A pointer to the extension is returned in dss->extensionValue, and the length of that
  1475. ;extension is returned in dss->extensionSize.  If there is no extension, dss->extensionValue will
  1476. ;be set to nil.  This routine will unpack the RecordID (if any) into rid, unpack the rest
  1477. ;into dss, and set dss->entitySpecifier to rid.
  1478. ;
  1479.  
  1480. ;
  1481. ; pascal void OCEUnpackDSSpec(const PackedDSSpec *pdss, DSSpec *dss, RecordID *rid)
  1482. ;
  1483.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  1484.         Macro
  1485.         _OCEUnpackDSSpec
  1486.             move.w              #$032F,D0
  1487.             dc.w                $AA5C
  1488.         EndM
  1489.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  1490.         IMPORT_CFM_FUNCTION OCEUnpackDSSpec
  1491.     ENDIF
  1492.  
  1493.  
  1494. ;Create a PackedDSSpec from a DSSpec.  pdss must be large enough to
  1495. ;contain the packed RecordID and any extension.  A memFull error will be returned if that
  1496. ;is not the case.  pdssLength is the number of bytes that can be put into pdss,
  1497. ;not counting the header.
  1498. ;
  1499.  
  1500. ;
  1501. ; pascal OSErr OCEPackDSSpec(const DSSpec *dss, PackedDSSpec *pdss, unsigned short pdssLength)
  1502. ;
  1503.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  1504.         Macro
  1505.         _OCEPackDSSpec
  1506.             move.w              #$0322,D0
  1507.             dc.w                $AA5C
  1508.         EndM
  1509.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  1510.         IMPORT_CFM_FUNCTION OCEPackDSSpec
  1511.     ENDIF
  1512.  
  1513.  
  1514. ;Compute the number of bytes of memory needed to hold a DSSpec when packed. This
  1515. ;length includes the length of the length field of PackedDSSpec, so it
  1516. ;is safe to do a NewPtr (OCEPackedDSSpecSize(...)).
  1517. ;
  1518.  
  1519. ;
  1520. ; pascal unsigned short OCEPackedDSSpecSize(const DSSpec *dss)
  1521. ;
  1522.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  1523.         Macro
  1524.         _OCEPackedDSSpecSize
  1525.             move.w              #$0327,D0
  1526.             dc.w                $AA5C
  1527.         EndM
  1528.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  1529.         IMPORT_CFM_FUNCTION OCEPackedDSSpecSize
  1530.     ENDIF
  1531.  
  1532.  
  1533. ;     Check the equality of two DSSpecs.  This compares all fields, even the
  1534. ;extension (unless extensionSize == 0).  The extensions are compared in a case-insensitive and
  1535. ;diacrit-insensitive manner. 
  1536.  
  1537. ;
  1538. ; pascal Boolean OCEEqualDSSpec(const DSSpec *pdss1, const DSSpec *pdss2)
  1539. ;
  1540.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  1541.         Macro
  1542.         _OCEEqualDSSpec
  1543.             move.w              #$030E,D0
  1544.             dc.w                $AA5C
  1545.         EndM
  1546.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  1547.         IMPORT_CFM_FUNCTION OCEEqualDSSpec
  1548.     ENDIF
  1549.  
  1550.  
  1551. ;     Check the equality of two PackedDSSpecs.  This compares all fields, even the
  1552. ;extension (unless extensionSize == 0).  The extensions are compared in a case-insensitive and
  1553. ;diacrit-insensitive manner. 
  1554.  
  1555. ;
  1556. ; pascal Boolean OCEEqualPackedDSSpec(const PackedDSSpec *pdss1, const PackedDSSpec *pdss2)
  1557. ;
  1558.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  1559.         Macro
  1560.         _OCEEqualPackedDSSpec
  1561.             move.w              #$0310,D0
  1562.             dc.w                $AA5C
  1563.         EndM
  1564.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  1565.         IMPORT_CFM_FUNCTION OCEEqualPackedDSSpec
  1566.     ENDIF
  1567.  
  1568.  
  1569. ;Check the validity of a PackedDSSpec.  If extensionType is
  1570. ;'entn', pdss must contain a valid entitySpecifier.  For all other extensionTypes, a nil
  1571. ;entitySpecifier is valid, but if non-nil, it will be checked for validity.  No check
  1572. ;is made on the extension.
  1573. ;
  1574.  
  1575. ;
  1576. ; pascal Boolean OCEValidPackedDSSpec(const PackedDSSpec *pdss)
  1577. ;
  1578.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  1579.         Macro
  1580.         _OCEValidPackedDSSpec
  1581.             move.w              #$0333,D0
  1582.             dc.w                $AA5C
  1583.         EndM
  1584.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  1585.         IMPORT_CFM_FUNCTION OCEValidPackedDSSpec
  1586.     ENDIF
  1587.  
  1588.  
  1589. ;Return info about a DSSpec.  This routine does not check validity.  If the
  1590. ;DSSpec has no extension, we determine whether it represents the root of all
  1591. ;catalogs, a single catalog, a DNode, or a Record.  Else it is invalid.
  1592. ;If the DSSpec has an extension, we simply return the extension type.
  1593. ;
  1594.  
  1595. ;
  1596. ; pascal OSType OCEGetDSSpecInfo(const DSSpec *spec)
  1597. ;
  1598.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  1599.         Macro
  1600.         _OCEGetDSSpecInfo
  1601.             move.w              #$0319,D0
  1602.             dc.w                $AA5C
  1603.         EndM
  1604.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  1605.         IMPORT_CFM_FUNCTION OCEGetDSSpecInfo
  1606.     ENDIF
  1607.  
  1608.  
  1609. ;  OCEGetExtensionType returns the extensionType imbedded in the PackedDSSpec. 
  1610. ;
  1611. ; pascal OSType OCEGetExtensionType(const PackedDSSpec *pdss)
  1612. ;
  1613.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  1614.         Macro
  1615.         _OCEGetExtensionType
  1616.             move.w              #$031C,D0
  1617.             dc.w                $AA5C
  1618.         EndM
  1619.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  1620.         IMPORT_CFM_FUNCTION OCEGetExtensionType
  1621.     ENDIF
  1622.  
  1623. ;OCEStreamPackedDSSpec streams (flattens) a catalog object a little at a time by
  1624. ;calling the DSSpecStreamer routine that you provide.
  1625. ;
  1626.  
  1627. ; typedef DSSpecStreamerUPP             DSSpecStreamer
  1628.  
  1629. ;
  1630. ; pascal OSErr OCEStreamPackedDSSpec(const DSSpec *dss, DSSpecStreamer stream, long userData, unsigned long *actualCount)
  1631. ;
  1632.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  1633.         Macro
  1634.         _OCEStreamPackedDSSpec
  1635.             move.w              #$033D,D0
  1636.             dc.w                $AA5C
  1637.         EndM
  1638.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  1639.         IMPORT_CFM_FUNCTION OCEStreamPackedDSSpec
  1640.     ENDIF
  1641.  
  1642. ; *** AttributeType ***
  1643. ;For the record, an AttributeType is an RString with a smaller maximum size.
  1644. ;I don't just typedef it to an RString, because I want the definition of the AttributeType
  1645. ;struct to contain the max length, because I need to include it in the Attribute struct
  1646. ;below.  But it should be possible to typecast any AttributeType to an RString and use
  1647. ;all the RString utilities on it.
  1648. ;
  1649.  
  1650. AttributeType            RECORD 0
  1651. charSet                     ds.w    1                ; offset: $0 (0)
  1652. dataLength                 ds.w    1                ; offset: $2 (2)
  1653. body                     ds.b    32                ; offset: $4 (4)        ;  always fixed at the max size 
  1654. sizeof                     EQU *                    ; size:   $24 (36)
  1655.                         ENDR
  1656. ; typedef struct AttributeType *        AttributeTypePtr
  1657.  
  1658. ;  Miscellaneous defines:  (these cannot be made into enums) 
  1659.  
  1660. kMinPackedRStringLength            EQU        4
  1661.  
  1662. kMinPackedRLISize                EQU        20
  1663. ; *** AttributeValue ***
  1664. ;  same class as is used in AppleEvents 
  1665. ; typedef DescType                         AttributeTag
  1666.  
  1667. AttributeValue            RECORD 0
  1668. tag                         ds.l    1                ; offset: $0 (0)
  1669. dataLength                 ds.l    1                ; offset: $4 (4)
  1670. bytes                     ds.l    1                ; offset: $8 (8)
  1671. sizeof                     EQU *                    ; size:   $C (12)
  1672.                         ENDR
  1673. ; typedef struct AttributeValue *        AttributeValuePtr
  1674.  
  1675. ; *** Attribute ***
  1676. Attribute                RECORD 0
  1677. attributeType             ds        AttributeType    ; offset: $0 (0)
  1678. cid                         ds        AttributeCreationID ; offset: $24 (36)
  1679. value                     ds        AttributeValue ; offset: $2C (44)
  1680. sizeof                     EQU *                    ; size:   $38 (56)
  1681.                         ENDR
  1682. ; typedef struct Attribute *            AttributePtr
  1683.  
  1684. ;
  1685. ; pascal RString *OCEGetIndRecordType(OCERecordTypeIndex stringIndex)
  1686. ;
  1687.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  1688.         Macro
  1689.         _OCEGetIndRecordType
  1690.             move.w              #$031B,D0
  1691.             dc.w                $AA5C
  1692.         EndM
  1693.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  1694.         IMPORT_CFM_FUNCTION OCEGetIndRecordType
  1695.     ENDIF
  1696.  
  1697. ;
  1698. ; pascal AttributeType *OCEGetIndAttributeType(OCEAttributeTypeIndex stringIndex)
  1699. ;
  1700.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  1701.         Macro
  1702.         _OCEGetIndAttributeType
  1703.             move.w              #$031A,D0
  1704.             dc.w                $AA5C
  1705.         EndM
  1706.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  1707.         IMPORT_CFM_FUNCTION OCEGetIndAttributeType
  1708.     ENDIF
  1709.  
  1710.  
  1711. _oceTBDispatch                    EQU        $AA5E
  1712. ; ****************************************************************************************
  1713. ;   PLEASE NOTE! ROUTINES HAVE MOVED TO THIS HEADER!
  1714. ;   OCESizePackedRecipient, OCEPackRecipient, OCEUnpackRecipient, OCEStreamRecipient,
  1715. ;   OCEGetRecipientType, and OCESetRecipientType have moved to the OCE header file.
  1716. ;   The OCEMessaging header includes the OCE header, so no changes to your code are
  1717. ;   required.
  1718. ;
  1719. ;***************************************************************************************
  1720.  
  1721. OCERecipient            RECORD 0
  1722. f                         ds        DSSpec
  1723. sizeof                     EQU *                    ; size:   $E (14)
  1724.                         ENDR
  1725.  
  1726.  
  1727.  
  1728. kOCESizePackedRecipient            EQU        830
  1729. kOCEPackRecipient                EQU        831
  1730. kOCEUnpackRecipient                EQU        832
  1731. kOCEStreamRecipient                EQU        833
  1732. kOCEGetRecipientType            EQU        834
  1733. kOCESetRecipientType            EQU        835
  1734. ;Compute the space that a OCERecipient would take if it were in packed
  1735. ;form.  [Note: does NOT even pad extensionSize, so you may get an odd #back out]
  1736. ;Safe to pass dereferenced handle(s).
  1737. ;
  1738.  
  1739. ;
  1740. ; pascal unsigned short OCESizePackedRecipient(const OCERecipient *rcpt)
  1741. ;
  1742.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  1743.         Macro
  1744.         _OCESizePackedRecipient
  1745.             move.w              #$033E,D0
  1746.             dc.w                $AA5C
  1747.         EndM
  1748.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  1749.         IMPORT_CFM_FUNCTION OCESizePackedRecipient
  1750.     ENDIF
  1751.  
  1752.  
  1753. ;Take an OCERecipient (scatter) and (gather) stream into the specified
  1754. ;buffer.  It is assumed that there is sufficient space in the buffer (that is
  1755. ;OCESizePackedRecipient).  Safe to pass dereferenced handle(s).
  1756. ;
  1757.  
  1758. ;
  1759. ; pascal unsigned short OCEPackRecipient(const OCERecipient *rcpt, void *buffer)
  1760. ;
  1761.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  1762.         Macro
  1763.         _OCEPackRecipient
  1764.             move.w              #$033F,D0
  1765.             dc.w                $AA5C
  1766.         EndM
  1767.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  1768.         IMPORT_CFM_FUNCTION OCEPackRecipient
  1769.     ENDIF
  1770.  
  1771. ;Take a packed OCERecipient and cast a the OCERecipient frame over it. Returns
  1772. ;amBadDestId if it doesn't look like an OCERecipient. Safe to pass dereferenced
  1773. ;handle(s).
  1774. ;
  1775.  
  1776. ;
  1777. ; pascal OSErr OCEUnpackRecipient(const void *buffer, OCERecipient *rcpt, RecordID *entitySpecifier)
  1778. ;
  1779.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  1780.         Macro
  1781.         _OCEUnpackRecipient
  1782.             move.w              #$0340,D0
  1783.             dc.w                $AA5C
  1784.         EndM
  1785.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  1786.         IMPORT_CFM_FUNCTION OCEUnpackRecipient
  1787.     ENDIF
  1788.  
  1789. ;Take an OCERecipient (scatter) and (gather) stream using the specified
  1790. ;function.  Safe to pass dereferenced handle(s).  If streamer function returns
  1791. ;OCEError OCEStreamRecipient stops execution and passes the error back to the caller
  1792. ;
  1793.  
  1794. ; typedef OCERecipientStreamerUPP         OCERecipientStreamer
  1795.  
  1796. ;
  1797. ; pascal OSErr OCEStreamRecipient(const OCERecipient *rcpt, OCERecipientStreamer stream, long userData, unsigned long *actualCount)
  1798. ;
  1799.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  1800.         Macro
  1801.         _OCEStreamRecipient
  1802.             move.w              #$0341,D0
  1803.             dc.w                $AA5C
  1804.         EndM
  1805.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  1806.         IMPORT_CFM_FUNCTION OCEStreamRecipient
  1807.     ENDIF
  1808.  
  1809. ;  Get the OCERecipient's extensionType. Safe to pass dereferenced handle(s).
  1810. ;
  1811. ; pascal OSType OCEGetRecipientType(const CreationID *cid)
  1812. ;
  1813.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  1814.         Macro
  1815.         _OCEGetRecipientType
  1816.             move.w              #$0342,D0
  1817.             dc.w                $AA5C
  1818.         EndM
  1819.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  1820.         IMPORT_CFM_FUNCTION OCEGetRecipientType
  1821.     ENDIF
  1822.  
  1823.  
  1824. ;Set the OCERecipient's extensionType in the specified cid.  (Note: we do NOT
  1825. ;check for a nil pointer).  If the extensionType is 'entn', the cid is assumed
  1826. ;to be "valid" and is not touched.  Note: to properly handle non 'entn''s this
  1827. ;routine must and will zero the high long (source) of the cid! Safe to pass
  1828. ;dereferenced handle(s).
  1829. ;
  1830.  
  1831. ;
  1832. ; pascal void OCESetRecipientType(OSType extensionType, CreationID *cid)
  1833. ;
  1834.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  1835.         Macro
  1836.         _OCESetRecipientType
  1837.             move.w              #$0343,D0
  1838.             dc.w                $AA5C
  1839.         EndM
  1840.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  1841.         IMPORT_CFM_FUNCTION OCESetRecipientType
  1842.     ENDIF
  1843.  
  1844. ; ****************************************************************************************
  1845. ;   PLEASE NOTE! ROUTINES HAVE MOVED TO THIS HEADER!
  1846. ;   OCEGetAccessControlDSSpec and its corresponding data type and constants have
  1847. ;   moved to the OCE header from OCEAuthDir. The OCEAuthDir header includes the OCE
  1848. ;   header, so no changes to your code are required.
  1849. ;   
  1850. ;***************************************************************************************
  1851.  
  1852. ;  access categories bit numbers 
  1853.  
  1854. kThisRecordOwnerBit                EQU        0
  1855. kFriendsBit                        EQU        1
  1856. kAuthenticatedInDNodeBit        EQU        2
  1857. kAuthenticatedInDirectoryBit    EQU        3
  1858. kGuestBit                        EQU        4
  1859. kMeBit                            EQU        5
  1860. ;  Values of CategoryMask 
  1861.  
  1862. kThisRecordOwnerMask            EQU        1
  1863. kFriendsMask                    EQU        2
  1864. kAuthenticatedInDNodeMask        EQU        4
  1865. kAuthenticatedInDirectoryMask    EQU        8
  1866. kGuestMask                        EQU        16
  1867. kMeMask                            EQU        32
  1868. ; typedef unsigned long                 CategoryMask
  1869.  
  1870. ;pass kThisRecordOwnerMask, kFriendsMask, kAuthenticatedInDNodeMask, kAuthenticatedInDirectoryMask,
  1871. ;kGuestMask, or kMeMask to this routine, and it will return a pointer to a
  1872. ;DSSpec that can be used in the Get or Set Access Controls calls.
  1873. ;
  1874.  
  1875. ;
  1876. ; pascal DSSpec *OCEGetAccessControlDSSpec(CategoryMask categoryBitMask)
  1877. ;
  1878.     IF TARGET_OS_MAC ** TARGET_CPU_68K ** ¬ TARGET_RT_MAC_CFM THEN
  1879.         Macro
  1880.         _OCEGetAccessControlDSSpec
  1881.             move.w              #$0345,D0
  1882.             dc.w                $AA5C
  1883.         EndM
  1884.     ELSEIF TARGET_OS_MAC ** TARGET_RT_MAC_CFM THEN
  1885.         IMPORT_CFM_FUNCTION OCEGetAccessControlDSSpec
  1886.     ENDIF
  1887.  
  1888.  
  1889.  
  1890.  
  1891.     ENDIF ; __OCE__ 
  1892.  
  1893.